unit TankTable;

{$mode objfpc}{$H+}

//========================================================================================
//
// Unit : TankTable.pas
//
// Description :
//
// Called By : ApplicationSettings : TfrmSettings.FormShow
//                                   TfrmSettings.ReadSettingsFile
//                                   TfrmSettings.WriteSettingsFile
//             Main : TfrmMain.mnuFileNewTankClick
//
// Calls :     HUtils : ValidAlphaNumericCharacter
//             TankData : frmTankData.ShowModal
//
// Ver. : 1.0.0
//
// Date : 19 Oct 2016
//
//========================================================================================

interface

uses
  Classes, SysUtils, sqlite3conn, sqldb, db, FileUtil, Forms, Controls,
  Graphics, Dialogs, Buttons, DBGrids, StdCtrls,
  // Application units
  ApplicationSettings, HUtils, TankData;

const
  tTankTypeArrayMaxEntries = 4;
  tTankLengthUnitArrayMaxEntries = 1;
//  tTemperatureUnitArrayMaxEntries = 1;
//  tVolumeUnitArrayMaxEntries = 1;

type

  tTankType = (ttFreshWater, ttFO, ttFOWLR, ttReef, ttOther);
  tTankTypeArray = array[0..tTankTypeArrayMaxEntries] of string;
//  tTankLengthUnit = (tlInches, tlCM);
//  tTankLengthUnitArray = array[0..tLengthUnitArrayMaxEntries] of string;
//  tTemperatureUnit = (tpDegF, tpDegC);
//  tTemperatureUnitArray = array[0..tTemperatureUnitArrayMaxEntries] of string;
//  tVolumeUnit = (tvGals, tvLitres);
//  tVolumeUnitArray = array[0..tVolumeUnitArrayMaxEntries] of string;

  { TfrmTankTable }

  TfrmTankTable = class(TForm)
    bbtOK: TBitBtn;
    bbtCancel: TBitBtn;
    bbtHelp: TBitBtn;
    bbtEnterStockList: TBitBtn;
    BitBtn1: TBitBtn;
    cbxLengthUnits: TComboBox;
    cbxTenperatureUnits: TComboBox;
    cbxVolumeUnits: TComboBox;
    cbxTankType: TComboBox;
    DataSourceTankTable: TDataSource;
    edtDepth: TEdit;
    edtHeight: TEdit;
    edtTankName: TEdit;
    edtVolume: TEdit;
    edtWidth: TEdit;
    gbxTankName: TGroupBox;
    gbxTankSize: TGroupBox;
    gbxTankUnits: TGroupBox;
    SQLQueryTankTable: TSQLQuery;
    stxTankName: TStaticText;
    stxTankType: TStaticText;
    stxLengthUnits: TStaticText;
    stxTemperatureUnits: TStaticText;
    stxVolumeUnits: TStaticText;
    stxDepth: TStaticText;
    stxHeight: TStaticText;
    stxVolume: TStaticText;
    stxWidth: TStaticText;
    procedure edtTankNameChange(Sender: TObject);
    procedure edtTankNameEnter(Sender: TObject);
    procedure edtTankNameExit(Sender: TObject);
    procedure edtTankNameKeyPress(Sender: TObject; var Key: char);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    // Default Values
    fDefaultTankType : tTankType;
    fDefaultTankLengthUnit : tLengthUnit;
    fDefaultTankTemperatureUnit : tTemperatureUnit;
    fDefaultTankVolumeUnit : tVolumeUnit;
  public
    const
      TankTypeArray: tTankTypeArray = ('Fresh Water', 'Fish Only',
                                  'Fish Only with Live Rock', 'Reef', 'Other');
      TankLengthUnitArray: tLengthUnitArray = ('Inches', 'Centimeters');
      TankTemperatureUnitArray: tTemperatureUnitArray = ('Degrees F', 'Degrees C');
      TankVolumeUnitArray: tVolumeUnitArray = ('Gallons', 'Litres');

    // Default Routines
    function GetDefaultTankType: tTankType;
    procedure SetDefaultTankType (TankType:tTankType);
    function GetDefaultTankTypeStr: string;
    procedure SetDefaultTankTypeFromStr (strTankType:string);

    function GetDefaultTankLengthUnit: tLengthUnit;
    function GetDefaultTankLengthUnitStr: string;
    procedure SetDefaultTankLengthUnit (TankLengthUnit:tLengthUnit);
    procedure SetDefaultTankLengthUnitFromStr (strTankLengthUnit:string);

    function GetDefaultTankTemperatureUnit: tTemperatureUnit;
    function GetDefaultTankTemperatureUnitStr: string;
    procedure SetDefaultTankTemperatureUnit (TankTemperatureUnit:tTemperatureUnit);
    procedure SetDefaultTankTemperatureUnitFromStr (strTankTemperatureUnit:string);

    function GetDefaultTankVolumeUnit: tVolumeUnit;
    function GetDefaultTankVolumeUnitStr: string;
    procedure SetDefaultTankVolumeUnit (TankVolumeUnit:tVolumeUnit);
    procedure SetDefaultTankVolumeUnitFromStr (strTankVolumeUnit:string);

    procedure CreateNewTanK;
  published
    //  Default Properties
    property DefaultTankType: tTankType read GetDefaultTankType
                                        write SetDefaultTankType;
    property DefaultTankLengthUnit: tLengthUnit read GetDefaultTankLengthUnit
                                            write SetDefaultTankLengthUnit;
    property DefaultTankTemperatureUnit: tTemperatureUnit read GetDefaultTankTemperatureUnit
                                                      write SetDefaultTankTemperatureUnit;
    property DefaultTankVolumeUnit: tVolumeUnit read GetDefaultTankVolumeUnit
                                            write SetDefaultTankVolumeUnit;
  end;

var
  frmTankTable: TfrmTankTable;

implementation

{$R *.lfm}

const
  cbytMinTTankNameLength = 5;
  cbytMaxTTankNameLength = 20;

//========================================================================================
//          SUPPORT ROUTINES
//========================================================================================

//========================================================================================
//          PRIVATE ROUTINES
//========================================================================================

//========================================================================================
//          PUBLIC ROUTINES
//========================================================================================
function TfrmTankTable.GetDefaultTankType: tTankType;
begin
  Result := fDefaultTankType;
end;// function GetDefaultTankType

//----------------------------------------------------------------------------------------
function TfrmTankTable.GetDefaultTankTypeStr: string;
begin
  Result := TankTypeArray[ord(frmTankTable.DefaultTankType)];
end;// function GetDefaultTankTypeStr

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankType (TankType:tTankType);
begin
  fDefaultTankType := TankType;
end;// procedure SetDefaultTankType

//----------------------------------------------------------------------------------------
{function TfrmTankTable.GetDefaultTankTypeStr: string;
begin
  Result := TankTypeArray[ord(frmTankTable.DefaultTankType)];
end;// function GetDefaultTankTypeStr  }

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankTypeFromStr (strTankType:string);
var
  vintTemp : integer;
begin
  for vintTemp := 0  to tTankTypeArrayMaxEntries do
    if TankTypeArray[vintTemp] = strTankType then
      fDefaultTankType := tTankType(vintTemp);
end;// procedure TfrmTankTable.SetDefaultTankTypeFromStr

//========================================================================================
function TfrmTankTable.GetDefaultTankLengthUnit: tLengthUnit;
begin
  Result := fDefaultTankLengthUnit;
end;// function TfrmTankTable.GetDefaultTankLengthUnit

//----------------------------------------------------------------------------------------
function TfrmTankTable.GetDefaultTankLengthUnitStr: string;
begin
  Result := frmSettings.LengthUnitArray[ord(frmTankTable.DefaultTankLengthUnit)];
end;// function TfrmTankTable.GetDefaultTankLengthUnitStr

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankLengthUnit (TankLengthUnit:tLengthUnit);
begin
  fDefaultTankLengthUnit := TankLengthUnit;
end;// procedure TfrmTankTable.SetDefaultTankLengthUnit

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankLengthUnitFromStr (strTankLengthUnit:string);
var
  vintTemp : integer;
begin
  for vintTemp := 0  to tLengthUnitArrayMaxEntries do
    if frmSettings.LengthUnitArray[vintTemp] = strTankLengthUnit then
      fDefaultTankLengthUnit := tLengthUnit(vintTemp);
end;// procedure TfrmTankTable.SetDefaultTankLengthUnitFromStr

//========================================================================================
function TfrmTankTable.GetDefaultTankTemperatureUnit: tTemperatureUnit;
begin
  Result := fDefaultTankTemperatureUnit;
end;// function TfrmTankTable.GetDefaultTankTemperatureUnit

//----------------------------------------------------------------------------------------
function TfrmTankTable.GetDefaultTankTemperatureUnitStr: string;
begin
  Result := frmSettings.TemperatureUnitArray[ord(frmTankTable.DefaultTankTemperatureUnit)];
end;// function TfrmTankTable.GetDefaultTemperatureUnitFromStr

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankTemperatureUnit (TankTemperatureUnit:tTemperatureUnit);
begin
  fDefaultTankTemperatureUnit := TankTemperatureUnit;
end;// procedure TfrmTankTable.SetDefaultTankTemperatureUnit

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankTemperatureUnitFromStr (strTankTemperatureUnit:string);
var
  vintTemp : integer;
begin
  for vintTemp := 0  to tTemperatureUnitArrayMaxEntries do
    if frmSettings.TemperatureUnitArray[vintTemp] = strTankTemperatureUnit then
      fDefaultTankTemperatureUnit := tTemperatureUnit(vintTemp);
end;// procedure TfrmTankTable.SetDefaultTemperatureUnitFromStr

//========================================================================================
function TfrmTankTable.GetDefaultTankVolumeUnit: tVolumeUnit;
begin
  Result := fDefaultTankVolumeUnit;
end;// function TfrmTankTable.GetDefaultTankVolumeUnit   }

//----------------------------------------------------------------------------------------
function TfrmTankTable.GetDefaultTankVolumeUnitStr: string;
begin
  Result := frmSettings.VolumeUnitArray[ord(frmTankTable.DefaultTankVolumeUnit)];
end;// function TfrmTankTable.GetDefaultTankVolumeUnitFromStr

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankVolumeUnit (TankVolumeUnit:tVolumeUnit);
begin
  fDefaultTankVolumeUnit := TankVolumeUnit;
end;// procedure TfrmTankTable.SetDefaultTankVolumeUnit

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.SetDefaultTankVolumeUnitFromStr (strTankVolumeUnit:string);
var
  vintTemp : integer;
begin
  for vintTemp := 0  to tVolumeUnitArrayMaxEntries do
    if frmSettings.VolumeUnitArray[vintTemp] = strTankVolumeUnit then
      fDefaultTankVolumeUnit := tVolumeUnit(vintTemp);
{  for vintTemp := 0  to tVolumeUnitArrayMaxEntries do
    if frmTankTable.VolumeUnitArray[vintTemp] = strVolumeUnit then
      fDefaultVolumeUnit := tVolumeUnit(vintTemp);}
end;// procedure TfrmTankTable.SetDefaultVolumeUnitFromStr

//========================================================================================
//          PUBLISHED ROUTINES
//========================================================================================

//========================================================================================
//          PROPERTY ROUTINES
//========================================================================================

//========================================================================================
//          MENU ROUTINES
//========================================================================================

//========== POPUP MENUS ===================================================================

//========================================================================================
//          TOOLBAR ROUTINES
//========================================================================================

//========================================================================================
//           STATUSBAR ROUTINES
//========================================================================================

//========================================================================================
//          FILE ROUTINES
//========================================================================================

//========================================================================================
//          COMMAND BUTTON ROUTINES
//========================================================================================

//========================================================================================
//          CONTROL ROUTINES
//========================================================================================

//===========================
//          edtTankName
//===========================
function ValidTankNameLength : boolean;
begin
  if Length(frmTankTable.edtTankName.Text) < cbytMinTTankNameLength then
    Result := False
  else
    Result := True;
 end;// function ValidTankNameLength

//----------------------------------------------------------------------------------------
procedure ValidateContents;
begin
    if ValidTankNameLength then
      frmTankTable.edtTankName.Color := clDefault
    else
      frmTankTable.edtTankName.Color := clInvalidContents;
end;// procedure ValidateContents

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.edtTankNameKeyPress(Sender: TObject; var Key: char);
begin
  Key := ValidAlphaNumericCharacter (Key);
end;// procedure TfrmTankTable.edtTankNameKeyPress

//----------------------------------------------------------------------------------------

procedure TfrmTankTable.edtTankNameEnter(Sender: TObject);
begin
  ValidateContents;
end;// procedure TfrmTankTable.edtTankNameEnter

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.edtTankNameChange(Sender: TObject);
begin
  ValidateContents;
end;// procedure TfrmTankTable.edtTankNameChange

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.edtTankNameExit(Sender: TObject);
begin
  if not ValidTankNameLength then
  begin
    edtTankName.Color := clInvalidContents;
    showmessage('Invalid Tank Name');
    edtTankName.SetFocus;
  end;
end;// procedure TfrmTankTable.edtTankNameExit

//========================================================================================
//          DATABASE ROUTINES
//========================================================================================

//========================================================================================
//          FORM ROUTINES
//========================================================================================
procedure TfrmTankTable.FormCreate(Sender: TObject);
begin

  // Set Max editbox lengths
  edtTankName.MaxLength := cbytMaxTTankNameLength;

  // Set Application defaults
  fDefaultTankType := ttFOWLR;
  fDefaultTankLengthUnit := luInch;

end;// procedure TfrmTankTable.FormCreate

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.FormShow(Sender: TObject);
begin

end;// procedure TfrmTankTable.FormShow

//----------------------------------------------------------------------------------------
procedure TfrmTankTable.CreateNewTank;
var
  vbytTemp : byte;
Begin

  frmTankTable.Caption := '[ Create a New Tank ]';

  // Initialize Content buttons
  bbtEnterStockList.Caption := 'Enter Stock List';
  bbtEnterStockList.Font.Color:= clRed;

  // Load the controls wirh Initial data
  fDefaultTankType := ttFOWLR;

  for vbytTemp := 0 to tTankTypeArrayMaxEntries do
    frmSettings.cbxDefaultTankType.Items.Add(frmTankTable.TankTypeArray[vbytTemp]);





  //    cbxDefaultTankType.Items.Add(frmTankTable.TankTypeArray[vbytTemp]);
  // frmSettings.{ts2TankData.}cbxDefaultTankType.ItemIndex := ord(TankTypeArray[ttFOWLR]);


  frmTankTable.ShowModal;

end;// procedure CreateNewTank

//========================================================================================

end.// unit TankTable

